{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We start, as normal, by creating a `Gobnilp` object to work with:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using license file /home/james/gurobi.lic\n",
      "Academic license - for non-commercial use only\n",
      "Changed value of parameter PreCrush to 1\n",
      "   Prev: 0  Min: 0  Max: 1  Default: 0\n",
      "Changed value of parameter CutPasses to 100000\n",
      "   Prev: -1  Min: -1  Max: 2000000000  Default: -1\n",
      "Changed value of parameter GomoryPasses to 100000\n",
      "   Prev: -1  Min: -1  Max: 2000000000  Default: -1\n",
      "Changed value of parameter MIPFocus to 2\n",
      "   Prev: 0  Min: 0  Max: 3  Default: 0\n",
      "Changed value of parameter ZeroHalfCuts to 2\n",
      "   Prev: -1  Min: -1  Max: 2  Default: -1\n",
      "Changed value of parameter MIPGap to 0.0\n",
      "   Prev: 0.0001  Min: 0.0  Max: inf  Default: 0.0001\n",
      "Changed value of parameter MIPGapAbs to 0.0\n",
      "   Prev: 1e-10  Min: 0.0  Max: inf  Default: 1e-10\n"
     ]
    }
   ],
   "source": [
    "from pygobnilp.gobnilp import Gobnilp\n",
    "m = Gobnilp()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we will create and store 'local scores' from the built-in `alarm_10000.dat` dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "m.learn('alarm_10000.dat',end='local scores')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that, since we have stated that learning should `end` after local scores have been computed and stored, a BN is not learned. The computation of these local scores is not immediate, but should not take too long. Since no local score function was specified and no data type specified either, the data will be assumed to be discrete and a BDeu score will be used. \n",
    "\n",
    "The local scores are saved in a dictionary which is the `local_scores` attribute of the `Gobnilp` object. The keys of this dictionary are the BN variables (the names of these variables are given on the first line of `alarm_10000.dat`). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['ANAPHYLAXIS', 'ARTCO2', 'BP', 'CATECHOL', 'CO', 'CVP', 'DISCONNECT', 'ERRCAUTER', 'ERRLOWOUTPUT', 'EXPCO2', 'FIO2', 'HISTORY', 'HR', 'HRBP', 'HREKG', 'HRSAT', 'HYPOVOLEMIA', 'INSUFFANESTH', 'INTUBATION', 'KINKEDTUBE', 'LVEDVOLUME', 'LVFAILURE', 'MINVOL', 'MINVOLSET', 'PAP', 'PCWP', 'PRESS', 'PULMEMBOLUS', 'PVSAT', 'SAO2', 'SHUNT', 'STROKEVOLUME', 'TPR', 'VENTALV', 'VENTLUNG', 'VENTMACH', 'VENTTUBE'])\n"
     ]
    }
   ],
   "source": [
    "print(m.local_scores.keys())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The value associated with each BN variable is a dictionary mapping potential parent sets for that variable to a local score - which states, intuitively, how good it would be for that parent set to be selected. We find that there is variation in the number of parent sets stored:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ANAPHYLAXIS 5\n",
      "ARTCO2 473\n",
      "BP 266\n",
      "CATECHOL 383\n",
      "CO 469\n",
      "CVP 32\n",
      "DISCONNECT 127\n",
      "ERRCAUTER 22\n",
      "ERRLOWOUTPUT 14\n",
      "EXPCO2 176\n",
      "FIO2 18\n",
      "HISTORY 36\n",
      "HR 154\n",
      "HRBP 135\n",
      "HREKG 122\n",
      "HRSAT 122\n",
      "HYPOVOLEMIA 57\n",
      "INSUFFANESTH 1\n",
      "INTUBATION 211\n",
      "KINKEDTUBE 41\n",
      "LVEDVOLUME 64\n",
      "LVFAILURE 84\n",
      "MINVOL 371\n",
      "MINVOLSET 96\n",
      "PAP 3\n",
      "PCWP 43\n",
      "PRESS 212\n",
      "PULMEMBOLUS 10\n",
      "PVSAT 440\n",
      "SAO2 471\n",
      "SHUNT 162\n",
      "STROKEVOLUME 109\n",
      "TPR 173\n",
      "VENTALV 472\n",
      "VENTLUNG 448\n",
      "VENTMACH 134\n",
      "VENTTUBE 317\n"
     ]
    }
   ],
   "source": [
    "for child, scored_parentsets in m.local_scores.items():\n",
    "    print(child, len(scored_parentsets))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ANAPHYLAXIS has a mere 5 parent sets whereas ARTCO2 has 473! This is because `Gobnilp` is using *pruning*. If a variable $X$ has potential parent set $S$ which is a superset of another potential parent set $T$ which has a higher score then $S$ is 'pruned' away. This is because, assuming we do not have any special constraints on allowed BNs, we can never have an optimal BN where $S$ is a parent set, since we could always replace $S$ with $T$ and get a higher scoring BN *without creating a cycle, since we would remove arrows*.\n",
    "\n",
    "It just so happens that more parent sets were pruned for ANAPHYLAXIS than ARTCO2. Let's look at the scored parent sets for ANAPHYLAXIS:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "frozenset() -578.587070487134\n",
      "frozenset({'BP'}) -523.5582005530596\n",
      "frozenset({'CATECHOL'}) -577.4536694322014\n",
      "frozenset({'TPR'}) -471.48556937259855\n",
      "frozenset({'HYPOVOLEMIA', 'BP'}) -518.1711042499956\n"
     ]
    }
   ],
   "source": [
    "for parentset, score in m.local_scores['ANAPHYLAXIS'].items():\n",
    "    print(parentset, score)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The empty set has the worst score of the 5 - if any of the non-empty parent set had a worse score it would be pruned.\n",
    "\n",
    "Each local score will be eventually be associated with a Gurobi MIP variable called a *family variable* (since it is associated with a 'child' variable and a parent set). The fewer of these family variables the better since the MIP will be smaller and thus easier for Gurobi to solve. If we have prior knowledge then this can \n",
    "1. reduce the number of local scores, and\n",
    "2. reduce the time required to compute the local scores\n",
    "\n",
    "To provide an example of how prior knowledge can help, let's see how often variables occur in the potential parent sets for ARTCO2:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counter({'EXPCO2': 101, 'SHUNT': 98, 'INTUBATION': 93, 'DISCONNECT': 91, 'CATECHOL': 85, 'KINKEDTUBE': 75, 'MINVOLSET': 72, 'VENTMACH': 62, 'PRESS': 60, 'SAO2': 56, 'VENTLUNG': 50, 'VENTTUBE': 50, 'HR': 49, 'HREKG': 42, 'HRSAT': 42, 'HRBP': 41, 'TPR': 40, 'PVSAT': 37, 'MINVOL': 31, 'CO': 25, 'FIO2': 12, 'BP': 7, 'VENTALV': 5, 'STROKEVOLUME': 1})\n"
     ]
    }
   ],
   "source": [
    "from collections import Counter\n",
    "d = Counter()\n",
    "for parent_set in m.local_scores['ARTCO2']:\n",
    "    for v in parent_set:\n",
    "        d[v] += 1\n",
    "print(d)    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So, for example KINKEDTUBE occurs in 75 parent sets. Now, suppose we knew that ARTCO2 and KINKEDTUNE had to be independent. Then we should provide this information to Gobnilp. We do this as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "m.add_obligatory_independence(['ARTCO2'],['KINKEDTUBE'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can recompute the local scores with this new information available:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "m.learn(start='data',end='local scores')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And now we can check that there should be 75 fewer parents for ARTCO2, and also some reduction in the parent sets for KINKEDTUBE. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "398\n",
      "32\n"
     ]
    }
   ],
   "source": [
    "print(len(m.local_scores['ARTCO2']))\n",
    "print(len(m.local_scores['KINKEDTUBE']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As expected there are $398 = 473 - 75$ fewere parent sets for ARTCO2, and also some reduction in the number of parent sets for KINKEDTUBE. This is because we asserted an independence constraint, which we can get to via the `obligatroy_conditional_indepedences` attribute:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{(frozenset({'ARTCO2'}), frozenset({'KINKEDTUBE'}), frozenset())}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.obligatory_conditional_independences"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that the independence constraint is stored as a conditional independence constraint with an empty conditioning set (the 3rd set in the tuple above). Also note that `Gobnilp` is taking advantage of this constraint before a MIP problem has been created - to help reduce the number of local scores computed. Naturally this constraint is also taken into account when learning a BN (which is done by constructing and solving a MIP model) to ensure that any learned BN satisfies the constraint.\n",
    "\n",
    "When an independence (or conditional independence) constraint is added (by the user) `Gobnilp` deduces that certain other simpler constraints follow. In our current example, it is deduced that\n",
    "1. there can be no arrow between the two variables, and\n",
    "2. the two variables cannot be adjacent in the undirected skeleton"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{('ARTCO2', 'KINKEDTUBE'), ('KINKEDTUBE', 'ARTCO2')}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.forbidden_arrows"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{frozenset({'ARTCO2', 'KINKEDTUBE'})}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.forbidden_adjacencies"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, let's learn an optimal BN and check that it satisfies the given independence constraint. Since this is a reasonably hard BN learning problem, we'll get the output from Gurobi printed out so we can at least see the progress. We do this by setting the appropriate Gurobi attribute. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Changed value of parameter OutputFlag to 1\n",
      "   Prev: 0  Min: 0  Max: 1  Default: 1\n",
      "Changed value of parameter PoolSolutions to 1\n",
      "   Prev: 10  Min: 1  Max: 2000000000  Default: 10\n",
      "Changed value of parameter LazyConstraints to 1\n",
      "   Prev: 0  Min: 0  Max: 1  Default: 0\n",
      "Discarded solution information\n",
      "Gurobi Optimizer version 9.0.0 build v9.0.0rc2 (linux64)\n",
      "Optimize a model with 2288 rows, 7349 columns and 158765 nonzeros\n",
      "Model fingerprint: 0x05469d81\n",
      "Variable types: 0 continuous, 7349 integer (7349 binary)\n",
      "Coefficient statistics:\n",
      "  Matrix range     [1e+00, 1e+00]\n",
      "  Objective range  [1e+02, 1e+04]\n",
      "  Bounds range     [1e+00, 1e+00]\n",
      "  RHS range        [1e+00, 1e+00]\n",
      "Presolve removed 663 rows and 383 columns\n",
      "Presolve time: 0.59s\n",
      "Presolved: 1625 rows, 6966 columns, 85959 nonzeros\n",
      "Variable types: 0 continuous, 6966 integer (6966 binary)\n",
      "Found heuristic solution: objective -205904.1188\n",
      "Presolve removed 382 rows and 0 columns\n",
      "Presolved: 1245 rows, 6966 columns, 29441 nonzeros\n",
      "\n",
      "\n",
      "Root relaxation: objective -8.362617e+04, 205 iterations, 0.07 seconds\n",
      "\n",
      "    Nodes    |    Current Node    |     Objective Bounds      |     Work\n",
      " Expl Unexpl |  Obj  Depth IntInf | Incumbent    BestBd   Gap | It/Node Time\n",
      "\n",
      "     0     0 -83626.171    0   45 -205904.12 -83626.171  59.4%     -    0s\n",
      "     0     0 -85269.604    0   80 -205904.12 -85269.604  58.6%     -    1s\n",
      "     0     0 -85480.549    0   27 -205904.12 -85480.549  58.5%     -    1s\n",
      "     0     0 -86385.401    0  150 -205904.12 -86385.401  58.0%     -    1s\n",
      "     0     0 -86613.668    0   38 -205904.12 -86613.668  57.9%     -    2s\n",
      "     0     0 -87014.774    0   55 -205904.12 -87014.774  57.7%     -    2s\n",
      "     0     0 -87143.296    0  144 -205904.12 -87143.296  57.7%     -    2s\n",
      "     0     0 -88898.576    0  213 -205904.12 -88898.576  56.8%     -    2s\n",
      "     0     0 -89005.873    0  217 -205904.12 -89005.873  56.8%     -    2s\n",
      "     0     0 -89824.417    0   88 -205904.12 -89824.417  56.4%     -    2s\n",
      "     0     0 -89896.780    0  246 -205904.12 -89896.780  56.3%     -    3s\n",
      "     0     0 -91142.411    0  193 -205904.12 -91142.411  55.7%     -    3s\n",
      "     0     0 -92995.992    0  186 -205904.12 -92995.992  54.8%     -    3s\n",
      "     0     0 -93483.431    0  180 -205904.12 -93483.431  54.6%     -    3s\n",
      "     0     0 -93641.013    0  213 -205904.12 -93641.013  54.5%     -    3s\n",
      "     0     0 -94145.102    0  170 -205904.12 -94145.102  54.3%     -    3s\n",
      "     0     0 -94604.223    0  202 -205904.12 -94604.223  54.1%     -    3s\n",
      "     0     0 -94694.544    0  222 -205904.12 -94694.544  54.0%     -    3s\n",
      "     0     0 -97376.832    0  310 -205904.12 -97376.832  52.7%     -    4s\n",
      "     0     0 -98992.648    0  256 -205904.12 -98992.648  51.9%     -    4s\n",
      "     0     0 -99201.329    0  325 -205904.12 -99201.329  51.8%     -    4s\n",
      "     0     0 -101251.98    0  319 -205904.12 -101251.98  50.8%     -    4s\n",
      "     0     0 -101572.82    0  328 -205904.12 -101572.82  50.7%     -    4s\n",
      "     0     0 -101934.25    0  319 -205904.12 -101934.25  50.5%     -    4s\n",
      "     0     0 -102294.43    0  337 -205904.12 -102294.43  50.3%     -    5s\n",
      "     0     0 -102508.31    0  337 -205904.12 -102508.31  50.2%     -    5s\n",
      "     0     0 -102800.77    0  329 -205904.12 -102800.77  50.1%     -    5s\n",
      "     0     0 -103069.80    0  346 -205904.12 -103069.80  49.9%     -    5s\n",
      "     0     0 -103214.26    0  341 -205904.12 -103214.26  49.9%     -    6s\n",
      "     0     0 -103325.21    0  321 -205904.12 -103325.21  49.8%     -    6s\n",
      "     0     0 -103379.05    0  341 -205904.12 -103379.05  49.8%     -    6s\n",
      "     0     0 -103587.29    0  376 -205904.12 -103587.29  49.7%     -    6s\n",
      "     0     0 -103737.57    0  362 -205904.12 -103737.57  49.6%     -    7s\n",
      "     0     0 -103816.43    0  401 -205904.12 -103816.43  49.6%     -    7s\n",
      "     0     0 -103978.24    0  356 -205904.12 -103978.24  49.5%     -    7s\n",
      "     0     0 -104047.70    0  331 -205904.12 -104047.70  49.5%     -    8s\n",
      "     0     0 -104077.72    0  350 -205904.12 -104077.72  49.5%     -    8s\n",
      "     0     0 -104085.90    0  275 -205904.12 -104085.90  49.4%     -    8s\n",
      "     0     0 -104114.21    0  263 -205904.12 -104114.21  49.4%     -    8s\n",
      "     0     0 -104114.48    0   76 -205904.12 -104114.48  49.4%     -    8s\n",
      "     0     0 -104193.19    0  324 -205904.12 -104193.19  49.4%     -    9s\n",
      "     0     0 -104193.19    0  324 -205904.12 -104193.19  49.4%     -   10s\n",
      "     0     0 -104243.53    0  336 -205904.12 -104243.53  49.4%     -   14s\n",
      "     0     0 -104243.53    0  336 -205904.12 -104243.53  49.4%     -   15s\n",
      "     0     0 -104257.79    0  368 -205904.12 -104257.79  49.4%     -   15s\n",
      "     0     0 -104277.94    0  335 -205904.12 -104277.94  49.4%     -   15s\n",
      "     0     0 -104284.42    0  331 -205904.12 -104284.42  49.4%     -   16s\n",
      "     0     0 -104286.60    0  219 -205904.12 -104286.60  49.4%     -   16s\n",
      "     0     0 -104288.40    0  328 -205904.12 -104288.40  49.4%     -   16s\n",
      "     0     0 -104404.44    0  211 -205904.12 -104404.44  49.3%     -   17s\n",
      "     0     0 -104419.82    0  223 -205904.12 -104419.82  49.3%     -   18s\n",
      "     0     0 -104458.37    0  231 -205904.12 -104458.37  49.3%     -   19s\n",
      "     0     0 -104489.15    0  376 -205904.12 -104489.15  49.3%     -   20s\n",
      "     0     0 -104498.32    0  252 -205904.12 -104498.32  49.2%     -   20s\n",
      "     0     0 -104545.94    0  362 -205904.12 -104545.94  49.2%     -   21s\n",
      "     0     0 -104550.03    0  380 -205904.12 -104550.03  49.2%     -   21s\n",
      "     0     0 -104554.28    0  376 -205904.12 -104554.28  49.2%     -   21s\n",
      "     0     0 -104555.92    0  404 -205904.12 -104555.92  49.2%     -   22s\n",
      "     0     0 -104589.75    0  361 -205904.12 -104589.75  49.2%     -   23s\n",
      "     0     0 -104591.08    0  340 -205904.12 -104591.08  49.2%     -   23s\n",
      "     0     0 -104597.12    0  331 -205904.12 -104597.12  49.2%     -   24s\n",
      "     0     0 -104599.14    0  383 -205904.12 -104599.14  49.2%     -   24s\n",
      "     0     0 -104600.47    0  374 -205904.12 -104600.47  49.2%     -   25s\n",
      "     0     0 -104602.19    0  428 -205904.12 -104602.19  49.2%     -   25s\n",
      "     0     0 -104603.66    0  386 -205904.12 -104603.66  49.2%     -   26s\n",
      "     0     0 -104604.35    0  425 -205904.12 -104604.35  49.2%     -   27s\n",
      "     0     0 -104604.35    0  422 -205904.12 -104604.35  49.2%     -   29s\n",
      "     0     0 -104604.35    0  422 -205904.12 -104604.35  49.2%     -   30s\n",
      "     0     2 -104619.66    0  422 -205904.12 -104619.66  49.2%     -   34s\n",
      "     3     6 -104702.79    2  287 -205904.12 -104619.66  49.2%   281   35s\n",
      "    68    71 -105210.03   18   36 -205904.12 -104636.05  49.2%   213   41s\n",
      "   156   149 -105793.19   59    - -205904.12 -104701.70  49.2%   165   46s\n",
      "   245   235 -105077.65   21  146 -205904.12 -104701.96  49.2%   142   50s\n",
      "   320   314 -105305.76   38  137 -205904.12 -104701.96  49.2%   145   55s\n",
      "   465   418 -105067.93   10  303 -205904.12 -104703.32  49.1%   131   60s\n",
      "   557   496 -105318.16   62   79 -205904.12 -104730.35  49.1%   123   65s\n",
      "   680   604 -105519.33   86   24 -205904.12 -104755.42  49.1%   116   70s\n",
      "   804   685 -105256.96   35  422 -205904.12 -104775.45  49.1%   106   78s\n",
      "   806   686 -105415.26   77  133 -205904.12 -104775.45  49.1%   106   80s\n",
      "   822   697 -105357.94    7  388 -205904.12 -104775.45  49.1%   104   85s\n",
      "H  822   661                    -105380.9245 -104775.45  0.57%   104   86s\n",
      "   829   666 -105380.92   34  420 -105380.92 -104775.45  0.57%   103   90s\n",
      "H  829   633                    -105335.8191 -104775.45  0.53%   103   90s\n",
      "   834   636 -105335.82   61  402 -105335.82 -104775.45  0.53%   102  100s\n",
      "   842   641 -105335.82   53  440 -105335.82 -104795.70  0.51%   102  107s\n",
      "   845   646 -104844.79   11  363 -105335.82 -104806.09  0.50%   109  111s\n",
      "   855   653 -105181.25   14  219 -105335.82 -104892.57  0.42%   112  115s\n",
      "   907   670 -105106.96   26  188 -105335.82 -104892.57  0.42%   118  120s\n",
      "  1000   672 -105028.09   16  233 -105335.82 -104991.77  0.33%   119  125s\n",
      "  1139   700 -105222.53   25   72 -105335.82 -105011.81  0.31%   116  130s\n",
      "  1252   723 -105246.52   35  274 -105335.82 -105028.84  0.29%   114  135s\n",
      "  1383   715 -105295.50   28  250 -105335.82 -105053.05  0.27%   116  140s\n",
      "  1517   715 -105277.77   23    4 -105335.82 -105073.71  0.25%   114  146s\n",
      "  1587   729 -105260.87   22  240 -105335.82 -105102.16  0.22%   113  150s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "H 1679   668                    -105331.8157 -105112.55  0.21%   111  154s\n",
      "  1681   661 -105328.57   57    5 -105331.82 -105118.18  0.20%   112  155s\n",
      "  1772   665 -105240.74   45  108 -105331.82 -105137.80  0.18%   113  161s\n",
      "  1855   649     cutoff   21      -105331.82 -105148.83  0.17%   113  165s\n",
      "  2038   574 -105298.95   27  187 -105331.82 -105168.83  0.15%   110  171s\n",
      "  2182   489 -105315.14   31    - -105331.82 -105193.02  0.13%   110  177s\n",
      "  2267   469 -105315.29   32    - -105331.82 -105207.31  0.12%   110  181s\n",
      "  2380   421 -105317.13   31    - -105331.82 -105216.09  0.11%   108  186s\n",
      "  2608   242 -105331.06   50    6 -105331.82 -105250.11  0.08%   104  193s\n",
      "  2722   245 -105326.39   51    - -105331.82 -105263.63  0.06%   102  195s\n",
      "  2832   233     cutoff   51      -105331.82 -105263.63  0.06%  99.5  200s\n",
      "  3069   249     cutoff   51      -105331.82 -105263.63  0.06%  93.1  208s\n",
      "  3221   316 -105309.24   62   14 -105331.82 -105263.63  0.06%  89.7  212s\n",
      "  3391   381     cutoff   44      -105331.82 -105265.65  0.06%  86.0  217s\n",
      "  3531   436     cutoff   66      -105331.82 -105269.75  0.06%  83.5  222s\n",
      "  3653   430 -105309.61   34    - -105331.82 -105269.75  0.06%  81.5  225s\n",
      "  3906   452 -105305.75   42   10 -105331.82 -105281.87  0.05%  77.3  234s\n",
      "  4256   534 -105304.72   43   19 -105331.82 -105291.81  0.04%  72.3  246s\n",
      "  4615   552     cutoff   44      -105331.82 -105294.08  0.04%  67.9  260s\n",
      "  5048   555 infeasible   67      -105331.82 -105298.01  0.03%  63.8  273s\n",
      "  5513   602 -105331.59   66    - -105331.82 -105298.41  0.03%  60.1  285s\n",
      "  5698   528     cutoff   66      -105331.82 -105304.00  0.03%  58.7  293s\n",
      "  6226   462     cutoff   45      -105331.82 -105308.49  0.02%  55.4  302s\n",
      "  6461   499     cutoff   46      -105331.82 -105309.80  0.02%  54.0  305s\n",
      "  6711   350 -105330.38   48    - -105331.82 -105310.64  0.02%  52.6  311s\n",
      "  6943   401 -105328.10   44    - -105331.82 -105310.64  0.02%  51.3  315s\n",
      "  7154   229     cutoff   48      -105331.82 -105310.64  0.02%  50.2  321s\n",
      "  7343   272     cutoff   44      -105331.82 -105316.75  0.01%  49.2  325s\n",
      "  7538    96 -105321.73   26    5 -105331.82 -105316.75  0.01%  48.4  330s\n",
      "  7906     0 -105329.92   50   11 -105331.82 -105317.78  0.01%  46.7  335s\n",
      "\n",
      "Cutting planes:\n",
      "  User: 792\n",
      "  Gomory: 3\n",
      "  Cover: 1\n",
      "  MIR: 5\n",
      "  Flow cover: 14\n",
      "  Zero half: 109\n",
      "  Lazy constraints: 1110\n",
      "\n",
      "Explored 8178 nodes (381475 simplex iterations) in 338.88 seconds\n",
      "Thread count was 4 (of 4 available processors)\n",
      "\n",
      "Solution count 1: -105332 \n",
      "No other solutions better than -105332\n",
      "\n",
      "Optimal solution found (tolerance 0.00e+00)\n",
      "Best objective -1.053318157194e+05, best bound -1.053318157194e+05, gap 0.0000%\n",
      "\n",
      "User-callback calls 50750, time in user-callback 149.28 sec\n",
      "**********\n",
      "BN has score -105331.81571940292\n",
      "**********\n",
      "ANAPHYLAXIS<-TPR -471.48556937259855\n",
      "TPR<- -10901.914716929197\n",
      "ARTCO2<-VENTALV -1816.018107669981\n",
      "VENTALV<-INTUBATION -7506.456092395529\n",
      "BP<-CO,TPR -4927.80460674889\n",
      "CO<-HR,STROKEVOLUME -2678.9117199075117\n",
      "CATECHOL<-ARTCO2,TPR -1521.301873422577\n",
      "HR<-CATECHOL -3744.599767304855\n",
      "STROKEVOLUME<-HYPOVOLEMIA,LVFAILURE -4437.288938131547\n",
      "CVP<-LVEDVOLUME -3006.6153021322098\n",
      "LVEDVOLUME<-HYPOVOLEMIA,LVFAILURE -3613.5057310384145\n",
      "DISCONNECT<-VENTTUBE -1567.6065855929337\n",
      "VENTTUBE<-INTUBATION,KINKEDTUBE,VENTLUNG -4542.004684191925\n",
      "ERRCAUTER<- -3222.576822231058\n",
      "ERRLOWOUTPUT<- -1972.2788189759885\n",
      "EXPCO2<-ARTCO2,VENTLUNG -1772.659127224848\n",
      "VENTLUNG<-INTUBATION,VENTALV -1274.187317113814\n",
      "FIO2<- -1888.6286705336533\n",
      "HISTORY<-LVFAILURE -637.4903136947833\n",
      "LVFAILURE<- -2010.543210255084\n",
      "HRBP<-ERRLOWOUTPUT,HR -1331.6218853034952\n",
      "HREKG<-ERRCAUTER,HR -1507.9736736634077\n",
      "HRSAT<-ERRCAUTER,HR -1452.085102920697\n",
      "HYPOVOLEMIA<- -4990.780506105162\n",
      "INSUFFANESTH<- -3303.7325344726705\n",
      "INTUBATION<- -3428.3602719444025\n",
      "KINKEDTUBE<- -1558.2831144287484\n",
      "MINVOL<-INTUBATION,VENTLUNG -2061.9057414226554\n",
      "MINVOLSET<-VENTMACH -946.556491622774\n",
      "VENTMACH<-DISCONNECT,VENTTUBE -1896.468405037318\n",
      "PAP<-PULMEMBOLUS -4008.254809145714\n",
      "PULMEMBOLUS<- -583.1474353126687\n",
      "PCWP<-LVEDVOLUME -2233.6875379606645\n",
      "PRESS<-INTUBATION,KINKEDTUBE,VENTTUBE -8478.131859909474\n",
      "PVSAT<-FIO2,VENTALV -846.3768118197622\n",
      "SAO2<-PVSAT,SHUNT -1137.5909747223777\n",
      "SHUNT<-INTUBATION,PULMEMBOLUS -2052.9806218132726\n",
      "**********\n",
      "bnlearn modelstring = \n",
      "[ANAPHYLAXIS|TPR][TPR][ARTCO2|VENTALV][VENTALV|INTUBATION][BP|TPR:CO][CO|HR:STROKEVOLUME][CATECHOL|TPR:ARTCO2][HR|CATECHOL][STROKEVOLUME|LVFAILURE:HYPOVOLEMIA][CVP|LVEDVOLUME][LVEDVOLUME|LVFAILURE:HYPOVOLEMIA][DISCONNECT|VENTTUBE][VENTTUBE|VENTLUNG:INTUBATION:KINKEDTUBE][ERRCAUTER][ERRLOWOUTPUT][EXPCO2|VENTLUNG:ARTCO2][VENTLUNG|INTUBATION:VENTALV][FIO2][HISTORY|LVFAILURE][LVFAILURE][HRBP|HR:ERRLOWOUTPUT][HREKG|HR:ERRCAUTER][HRSAT|HR:ERRCAUTER][HYPOVOLEMIA][INSUFFANESTH][INTUBATION][KINKEDTUBE][MINVOL|VENTLUNG:INTUBATION][MINVOLSET|VENTMACH][VENTMACH|VENTTUBE:DISCONNECT][PAP|PULMEMBOLUS][PULMEMBOLUS][PCWP|LVEDVOLUME][PRESS|INTUBATION:KINKEDTUBE:VENTTUBE][PVSAT|FIO2:VENTALV][SAO2|PVSAT:SHUNT][SHUNT|PULMEMBOLUS:INTUBATION]\n",
      "**********\n",
      "CPDAG:\n",
      "Vertices: ANAPHYLAXIS,TPR,ARTCO2,VENTALV,BP,CO,CATECHOL,HR,STROKEVOLUME,CVP,LVEDVOLUME,DISCONNECT,VENTTUBE,ERRCAUTER,ERRLOWOUTPUT,EXPCO2,VENTLUNG,FIO2,HISTORY,LVFAILURE,HRBP,HREKG,HRSAT,HYPOVOLEMIA,INSUFFANESTH,INTUBATION,KINKEDTUBE,MINVOL,MINVOLSET,VENTMACH,PAP,PULMEMBOLUS,PCWP,PRESS,PVSAT,SAO2,SHUNT\n",
      "TPR-ANAPHYLAXIS\n",
      "TPR->BP\n",
      "TPR->CATECHOL\n",
      "ARTCO2->CATECHOL\n",
      "ARTCO2->EXPCO2\n",
      "VENTALV-ARTCO2\n",
      "VENTALV->PVSAT\n",
      "VENTALV-VENTLUNG\n",
      "CO->BP\n",
      "CATECHOL->HR\n",
      "HR->CO\n",
      "HR->HRBP\n",
      "HR->HREKG\n",
      "HR->HRSAT\n",
      "STROKEVOLUME->CO\n",
      "LVEDVOLUME->CVP\n",
      "LVEDVOLUME->PCWP\n",
      "DISCONNECT-VENTMACH\n",
      "VENTTUBE->DISCONNECT\n",
      "VENTTUBE->PRESS\n",
      "VENTTUBE->VENTMACH\n",
      "ERRCAUTER->HREKG\n",
      "ERRCAUTER->HRSAT\n",
      "ERRLOWOUTPUT->HRBP\n",
      "VENTLUNG->EXPCO2\n",
      "VENTLUNG-MINVOL\n",
      "VENTLUNG->VENTTUBE\n",
      "FIO2->PVSAT\n",
      "LVFAILURE-HISTORY\n",
      "LVFAILURE->LVEDVOLUME\n",
      "LVFAILURE->STROKEVOLUME\n",
      "HYPOVOLEMIA->LVEDVOLUME\n",
      "HYPOVOLEMIA->STROKEVOLUME\n",
      "INTUBATION-MINVOL\n",
      "INTUBATION->PRESS\n",
      "INTUBATION->SHUNT\n",
      "INTUBATION-VENTALV\n",
      "INTUBATION-VENTLUNG\n",
      "INTUBATION->VENTTUBE\n",
      "KINKEDTUBE->PRESS\n",
      "KINKEDTUBE->VENTTUBE\n",
      "VENTMACH->MINVOLSET\n",
      "PULMEMBOLUS-PAP\n",
      "PULMEMBOLUS->SHUNT\n",
      "PVSAT->SAO2\n",
      "SHUNT->SAO2\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "m.learn(start='local scores',gurobi_output=True) # construct a MIP model and get Gurobi to solve it"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Gobnilp/Gurobi took quite a while to find a provably optimal BN in this case (and recall that we are running with the default parent set limit of 3 - were we to raise that solving would take longer still). As is normal Gobnilp spent some time adding cutting planes to reduce the upper bound on the score of an optimal BN from an original upper bound of -83626.171 down to -104619.66. Then Gurobi builds a search tree by branching on the values of MIP variables, finally finding a BN with a reasonable score at node 822 of this tree. Although at this point we know that the incumbent is close to the best possible BN (gap = 0.57%) it takes quite a while longer and thousands more search nodes before we can be sure we have an optimal BN. \n",
    "\n",
    "It is interesting to compare this to what happens when we learn from this dataset with *no extra constraints*:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Changed value of parameter PreCrush to 1\n",
      "   Prev: 0  Min: 0  Max: 1  Default: 0\n",
      "Changed value of parameter CutPasses to 100000\n",
      "   Prev: -1  Min: -1  Max: 2000000000  Default: -1\n",
      "Changed value of parameter GomoryPasses to 100000\n",
      "   Prev: -1  Min: -1  Max: 2000000000  Default: -1\n",
      "Changed value of parameter MIPFocus to 2\n",
      "   Prev: 0  Min: 0  Max: 3  Default: 0\n",
      "Changed value of parameter ZeroHalfCuts to 2\n",
      "   Prev: -1  Min: -1  Max: 2  Default: -1\n",
      "Changed value of parameter MIPGap to 0.0\n",
      "   Prev: 0.0001  Min: 0.0  Max: inf  Default: 0.0001\n",
      "Changed value of parameter MIPGapAbs to 0.0\n",
      "   Prev: 1e-10  Min: 0.0  Max: inf  Default: 1e-10\n",
      "Parameter OutputFlag unchanged\n",
      "   Value: 1  Min: 0  Max: 1  Default: 1\n",
      "Changed value of parameter PoolSolutions to 1\n",
      "   Prev: 10  Min: 1  Max: 2000000000  Default: 10\n",
      "Changed value of parameter LazyConstraints to 1\n",
      "   Prev: 0  Min: 0  Max: 1  Default: 0\n",
      "Discarded solution information\n",
      "Gurobi Optimizer version 9.0.0 build v9.0.0rc2 (linux64)\n",
      "Optimize a model with 2304 rows, 7437 columns and 161370 nonzeros\n",
      "Model fingerprint: 0xd35b1531\n",
      "Variable types: 0 continuous, 7437 integer (7437 binary)\n",
      "Coefficient statistics:\n",
      "  Matrix range     [1e+00, 1e+00]\n",
      "  Objective range  [1e+02, 1e+04]\n",
      "  Bounds range     [1e+00, 1e+00]\n",
      "  RHS range        [1e+00, 1e+00]\n",
      "Presolve removed 663 rows and 382 columns\n",
      "Presolve time: 0.61s\n",
      "Presolved: 1641 rows, 7055 columns, 87103 nonzeros\n",
      "Variable types: 0 continuous, 7055 integer (7055 binary)\n",
      "Found heuristic solution: objective -205904.1188\n",
      "Presolve removed 384 rows and 0 columns\n",
      "Presolved: 1259 rows, 7055 columns, 30194 nonzeros\n",
      "\n",
      "\n",
      "Root relaxation: objective -8.362617e+04, 209 iterations, 0.08 seconds\n",
      "\n",
      "    Nodes    |    Current Node    |     Objective Bounds      |     Work\n",
      " Expl Unexpl |  Obj  Depth IntInf | Incumbent    BestBd   Gap | It/Node Time\n",
      "\n",
      "     0     0 -83626.171    0   45 -205904.12 -83626.171  59.4%     -    0s\n",
      "     0     0 -85269.604    0   80 -205904.12 -85269.604  58.6%     -    1s\n",
      "     0     0 -86855.165    0  119 -205904.12 -86855.165  57.8%     -    1s\n",
      "     0     0 -89330.686    0  124 -205904.12 -89330.686  56.6%     -    2s\n",
      "     0     0 -90135.061    0   28 -205904.12 -90135.061  56.2%     -    2s\n",
      "     0     0 -90607.947    0   35 -205904.12 -90607.947  56.0%     -    2s\n",
      "     0     0 -90928.085    0   95 -205904.12 -90928.085  55.8%     -    2s\n",
      "     0     0 -91351.872    0   97 -205904.12 -91351.872  55.6%     -    3s\n",
      "     0     0 -93564.967    0  187 -205904.12 -93564.967  54.6%     -    4s\n",
      "     0     0 -93855.817    0  168 -205904.12 -93855.817  54.4%     -    4s\n",
      "     0     0 -96373.054    0  280 -205904.12 -96373.054  53.2%     -    4s\n",
      "     0     0 -96925.946    0  272 -205904.12 -96925.946  52.9%     -    4s\n",
      "     0     0 -98423.047    0  293 -205904.12 -98423.047  52.2%     -    4s\n",
      "     0     0 -98926.822    0  265 -205904.12 -98926.822  52.0%     -    5s\n",
      "     0     0 -99592.098    0  308 -205904.12 -99592.098  51.6%     -    5s\n",
      "     0     0 -99999.530    0  251 -205904.12 -99999.530  51.4%     -    5s\n",
      "     0     0 -101214.96    0  293 -205904.12 -101214.96  50.8%     -    5s\n",
      "     0     0 -102461.94    0  303 -205904.12 -102461.94  50.2%     -    5s\n",
      "     0     0 -102943.08    0  279 -205904.12 -102943.08  50.0%     -    6s\n",
      "     0     0 -103233.78    0  275 -205904.12 -103233.78  49.9%     -    6s\n",
      "     0     0 -103346.74    0  238 -205904.12 -103346.74  49.8%     -    6s\n",
      "     0     0 -103455.02    0  298 -205904.12 -103455.02  49.8%     -    6s\n",
      "     0     0 -103474.22    0  300 -205904.12 -103474.22  49.7%     -    6s\n",
      "     0     0 -103678.28    0  300 -205904.12 -103678.28  49.6%     -    7s\n",
      "     0     0 -103814.01    0  294 -205904.12 -103814.01  49.6%     -    7s\n",
      "     0     0 -103880.24    0  268 -205904.12 -103880.24  49.5%     -    7s\n",
      "     0     0 -104035.50    0  277 -205904.12 -104035.50  49.5%     -    8s\n",
      "     0     0 -104097.82    0  356 -205904.12 -104097.82  49.4%     -    9s\n",
      "     0     0 -104122.78    0  307 -205904.12 -104122.78  49.4%     -    9s\n",
      "     0     0 -104315.35    0  272 -205904.12 -104315.35  49.3%     -   10s\n",
      "H    0     0                    -107316.9764 -104315.35  2.80%     -   10s\n",
      "     0     0 -104361.56    0  103 -107316.98 -104361.56  2.75%     -   11s\n",
      "     0     0 -104371.37    0  316 -107316.98 -104371.37  2.74%     -   11s\n",
      "     0     0 -104482.11    0  271 -107316.98 -104482.11  2.64%     -   11s\n",
      "     0     0 -104492.67    0  330 -107316.98 -104492.67  2.63%     -   13s\n",
      "     0     0 -104493.91    0  288 -107316.98 -104493.91  2.63%     -   13s\n",
      "     0     0 -104525.72    0  354 -107316.98 -104525.72  2.60%     -   14s\n",
      "     0     0 -104533.65    0  310 -107316.98 -104533.65  2.59%     -   14s\n",
      "     0     0 -104559.47    0  281 -107316.98 -104559.47  2.57%     -   14s\n",
      "     0     0 -104559.76    0  279 -107316.98 -104559.76  2.57%     -   15s\n",
      "     0     0 -104578.83    0  181 -107316.98 -104578.83  2.55%     -   16s\n",
      "     0     0 -104579.25    0  163 -107316.98 -104579.25  2.55%     -   16s\n",
      "     0     0 -104590.93    0  362 -107316.98 -104590.93  2.54%     -   17s\n",
      "     0     0 -104591.84    0  335 -107316.98 -104591.84  2.54%     -   17s\n",
      "     0     0 -104595.89    0  305 -107316.98 -104595.89  2.54%     -   18s\n",
      "H    0     0                    -106678.6779 -104595.89  1.95%     -   19s\n",
      "     0     0 -104597.72    0  331 -106678.68 -104597.72  1.95%     -   19s\n",
      "     0     0 -104602.74    0  328 -106678.68 -104602.74  1.95%     -   20s\n",
      "     0     0 -104603.30    0  294 -106678.68 -104603.30  1.95%     -   20s\n",
      "     0     0 -104614.14    0  322 -106678.68 -104614.14  1.94%     -   21s\n",
      "     0     0 -104614.14    0  322 -106678.68 -104614.14  1.94%     -   26s\n",
      "     0     0 -104616.57    0  354 -106678.68 -104616.57  1.93%     -   29s\n",
      "     0     0 -104620.54    0  387 -106678.68 -104620.54  1.93%     -   30s\n",
      "     0     0 -104621.47    0  405 -106678.68 -104621.47  1.93%     -   30s\n",
      "     0     0 -104625.45    0  352 -106678.68 -104625.45  1.92%     -   31s\n",
      "     0     0 -104626.82    0  382 -106678.68 -104626.82  1.92%     -   31s\n",
      "     0     0 -104627.84    0  395 -106678.68 -104627.84  1.92%     -   32s\n",
      "     0     0 -104628.36    0  399 -106678.68 -104628.36  1.92%     -   32s\n",
      "     0     0 -104641.34    0  361 -106678.68 -104641.34  1.91%     -   33s\n",
      "     0     0 -104642.64    0  349 -106678.68 -104642.64  1.91%     -   34s\n",
      "     0     0 -104653.53    0  321 -106678.68 -104653.53  1.90%     -   34s\n",
      "     0     0 -104655.18    0  364 -106678.68 -104655.18  1.90%     -   35s\n",
      "     0     0 -104662.42    0  356 -106678.68 -104662.42  1.89%     -   36s\n",
      "     0     0 -104664.81    0  359 -106678.68 -104664.81  1.89%     -   36s\n",
      "     0     0 -104666.09    0  358 -106678.68 -104666.09  1.89%     -   36s\n",
      "     0     0 -104669.01    0  323 -106678.68 -104669.01  1.88%     -   37s\n",
      "     0     0 -104669.27    0  347 -106678.68 -104669.27  1.88%     -   37s\n",
      "     0     0 -104678.47    0  378 -106678.68 -104678.47  1.87%     -   38s\n",
      "     0     0 -104679.25    0  368 -106678.68 -104679.25  1.87%     -   39s\n",
      "     0     0 -104680.62    0  383 -106678.68 -104680.62  1.87%     -   40s\n",
      "     0     0 -104680.66    0  383 -106678.68 -104680.66  1.87%     -   40s\n",
      "     0     0 -104682.86    0  404 -106678.68 -104682.86  1.87%     -   41s\n",
      "     0     0 -104682.99    0  404 -106678.68 -104682.99  1.87%     -   41s\n",
      "     0     0 -104684.53    0  411 -106678.68 -104684.53  1.87%     -   42s\n",
      "     0     0 -104684.65    0  423 -106678.68 -104684.65  1.87%     -   42s\n",
      "     0     0 -104686.65    0  392 -106678.68 -104686.65  1.87%     -   43s\n",
      "     0     0 -104687.03    0  389 -106678.68 -104687.03  1.87%     -   43s\n",
      "     0     0 -104701.25    0  379 -106678.68 -104701.25  1.85%     -   44s\n",
      "     0     0 -104703.02    0  426 -106678.68 -104703.02  1.85%     -   45s\n",
      "     0     0 -104703.15    0  415 -106678.68 -104703.15  1.85%     -   46s\n",
      "H    0     0                    -105226.5119 -104703.15  0.50%     -   47s\n",
      "     0     0 -104722.17    0   85 -105226.51 -104722.17  0.48%     -   49s\n",
      "     0     0 -104722.17    0   85 -105226.51 -104722.17  0.48%     -   50s\n",
      "     0     0 -104722.17    0  236 -105226.51 -104722.17  0.48%     -   51s\n",
      "     0     0 -104722.17    0  133 -105226.51 -104722.17  0.48%     -   51s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     0     0 -104722.17    0  321 -105226.51 -104722.17  0.48%     -   51s\n",
      "     0     0 -104722.17    0  404 -105226.51 -104722.17  0.48%     -   51s\n",
      "     0     0 -104722.17    0  389 -105226.51 -104722.17  0.48%     -   52s\n",
      "     0     0 -104722.17    0  425 -105226.51 -104722.17  0.48%     -   52s\n",
      "     0     0 -104722.17    0  388 -105226.51 -104722.17  0.48%     -   52s\n",
      "     0     0 -104722.17    0  385 -105226.51 -104722.17  0.48%     -   53s\n",
      "     0     0 -104722.17    0  419 -105226.51 -104722.17  0.48%     -   54s\n",
      "     0     0 -104722.17    0  317 -105226.51 -104722.17  0.48%     -   55s\n",
      "     0     0 -104722.17    0  355 -105226.51 -104722.17  0.48%     -   55s\n",
      "     0     0 -104722.17    0  414 -105226.51 -104722.17  0.48%     -   56s\n",
      "     0     0 -104722.17    0  412 -105226.51 -104722.17  0.48%     -   57s\n",
      "     0     2 -104722.17    0  412 -105226.51 -104722.17  0.48%     -   60s\n",
      "   124    83 -105141.98   40  155 -105226.51 -104756.15  0.45%   155   65s\n",
      "   229   111     cutoff   32      -105226.51 -104826.92  0.38%   148   70s\n",
      "   353   170 -104990.43   14  353 -105226.51 -104845.79  0.36%   141   75s\n",
      "   424   200     cutoff   26      -105226.51 -104878.16  0.33%   146   80s\n",
      "   558   228     cutoff   19      -105226.51 -104947.94  0.26%   140   85s\n",
      "   742   242 -105193.27   25  209 -105226.51 -105000.91  0.21%   136   90s\n",
      "   881   232 -105097.21   11  169 -105226.51 -105031.30  0.19%   133   95s\n",
      "  1128   246     cutoff   24      -105226.51 -105061.14  0.16%   124  100s\n",
      "  1356   203     cutoff   24      -105226.51 -105099.49  0.12%   119  105s\n",
      "  1571    78 -105167.11   33   53 -105226.51 -105151.51  0.07%   113  110s\n",
      "\n",
      "Cutting planes:\n",
      "  User: 403\n",
      "  Gomory: 5\n",
      "  MIR: 1\n",
      "  Flow cover: 4\n",
      "  Zero half: 73\n",
      "  Lazy constraints: 6\n",
      "\n",
      "Explored 1945 nodes (204343 simplex iterations) in 112.85 seconds\n",
      "Thread count was 4 (of 4 available processors)\n",
      "\n",
      "Solution count 1: -105227 \n",
      "No other solutions better than -105227\n",
      "\n",
      "Optimal solution found (tolerance 0.00e+00)\n",
      "Best objective -1.052265119168e+05, best bound -1.052265119168e+05, gap 0.0000%\n",
      "\n",
      "User-callback calls 21479, time in user-callback 24.94 sec\n",
      "**********\n",
      "BN has score -105226.51191678\n",
      "**********\n",
      "ANAPHYLAXIS<-TPR -471.48556937259855\n",
      "TPR<- -10901.914716929197\n",
      "ARTCO2<-VENTALV -1816.018107669981\n",
      "VENTALV<-INTUBATION,VENTLUNG -1785.1568955858238\n",
      "BP<-CO,TPR -4927.80460674889\n",
      "CO<-HR,STROKEVOLUME -2678.9117199075117\n",
      "CATECHOL<-ARTCO2,TPR -1521.301873422577\n",
      "HR<-CATECHOL -3744.599767304855\n",
      "STROKEVOLUME<-HYPOVOLEMIA,LVFAILURE -4437.288938131547\n",
      "CVP<-LVEDVOLUME -3006.6153021322098\n",
      "LVEDVOLUME<-HYPOVOLEMIA,LVFAILURE -3613.5057310384145\n",
      "DISCONNECT<- -3295.0317430806754\n",
      "ERRCAUTER<- -3222.576822231058\n",
      "ERRLOWOUTPUT<- -1972.2788189759885\n",
      "EXPCO2<-ARTCO2,VENTLUNG -1772.659127224848\n",
      "VENTLUNG<-INTUBATION,KINKEDTUBE,VENTTUBE -3618.0085247885872\n",
      "FIO2<- -1888.6286705336533\n",
      "HISTORY<-LVFAILURE -637.4903136947833\n",
      "LVFAILURE<- -2010.543210255084\n",
      "HRBP<-ERRLOWOUTPUT,HR -1331.6218853034952\n",
      "HREKG<-ERRCAUTER,HR -1507.9736736634077\n",
      "HRSAT<-ERRCAUTER,HR -1452.085102920697\n",
      "HYPOVOLEMIA<- -4990.780506105162\n",
      "INSUFFANESTH<- -3303.7325344726705\n",
      "INTUBATION<- -3428.3602719444025\n",
      "KINKEDTUBE<- -1558.2831144287484\n",
      "MINVOL<-INTUBATION,VENTLUNG -2061.9057414226554\n",
      "MINVOLSET<- -3952.777366733397\n",
      "PAP<- -4194.791057672541\n",
      "PCWP<-LVEDVOLUME -2233.6875379606645\n",
      "PRESS<-INTUBATION,KINKEDTUBE,VENTTUBE -8478.131859909474\n",
      "VENTTUBE<-DISCONNECT,VENTMACH -1814.1386675404356\n",
      "PULMEMBOLUS<-PAP -396.6111867858417\n",
      "PVSAT<-FIO2,VENTALV -846.3768118197622\n",
      "SAO2<-PVSAT,SHUNT -1137.5909747223777\n",
      "SHUNT<-INTUBATION,PULMEMBOLUS -2052.9806218132726\n",
      "VENTMACH<-MINVOLSET -3162.862542532719\n",
      "**********\n",
      "bnlearn modelstring = \n",
      "[ANAPHYLAXIS|TPR][TPR][ARTCO2|VENTALV][VENTALV|VENTLUNG:INTUBATION][BP|TPR:CO][CO|HR:STROKEVOLUME][CATECHOL|TPR:ARTCO2][HR|CATECHOL][STROKEVOLUME|LVFAILURE:HYPOVOLEMIA][CVP|LVEDVOLUME][LVEDVOLUME|LVFAILURE:HYPOVOLEMIA][DISCONNECT][ERRCAUTER][ERRLOWOUTPUT][EXPCO2|VENTLUNG:ARTCO2][VENTLUNG|INTUBATION:KINKEDTUBE:VENTTUBE][FIO2][HISTORY|LVFAILURE][LVFAILURE][HRBP|HR:ERRLOWOUTPUT][HREKG|HR:ERRCAUTER][HRSAT|HR:ERRCAUTER][HYPOVOLEMIA][INSUFFANESTH][INTUBATION][KINKEDTUBE][MINVOL|VENTLUNG:INTUBATION][MINVOLSET][PAP][PCWP|LVEDVOLUME][PRESS|INTUBATION:KINKEDTUBE:VENTTUBE][VENTTUBE|VENTMACH:DISCONNECT][PULMEMBOLUS|PAP][PVSAT|FIO2:VENTALV][SAO2|PVSAT:SHUNT][SHUNT|PULMEMBOLUS:INTUBATION][VENTMACH|MINVOLSET]\n",
      "**********\n",
      "CPDAG:\n",
      "Vertices: ANAPHYLAXIS,TPR,ARTCO2,VENTALV,BP,CO,CATECHOL,HR,STROKEVOLUME,CVP,LVEDVOLUME,DISCONNECT,ERRCAUTER,ERRLOWOUTPUT,EXPCO2,VENTLUNG,FIO2,HISTORY,LVFAILURE,HRBP,HREKG,HRSAT,HYPOVOLEMIA,INSUFFANESTH,INTUBATION,KINKEDTUBE,MINVOL,MINVOLSET,PAP,PCWP,PRESS,VENTTUBE,PULMEMBOLUS,PVSAT,SAO2,SHUNT,VENTMACH\n",
      "TPR-ANAPHYLAXIS\n",
      "TPR->BP\n",
      "TPR->CATECHOL\n",
      "ARTCO2->CATECHOL\n",
      "ARTCO2->EXPCO2\n",
      "VENTALV->ARTCO2\n",
      "VENTALV->PVSAT\n",
      "CO->BP\n",
      "CATECHOL->HR\n",
      "HR->CO\n",
      "HR->HRBP\n",
      "HR->HREKG\n",
      "HR->HRSAT\n",
      "STROKEVOLUME->CO\n",
      "LVEDVOLUME->CVP\n",
      "LVEDVOLUME->PCWP\n",
      "DISCONNECT->VENTTUBE\n",
      "ERRCAUTER->HREKG\n",
      "ERRCAUTER->HRSAT\n",
      "ERRLOWOUTPUT->HRBP\n",
      "VENTLUNG->EXPCO2\n",
      "VENTLUNG->MINVOL\n",
      "VENTLUNG->VENTALV\n",
      "FIO2->PVSAT\n",
      "LVFAILURE-HISTORY\n",
      "LVFAILURE->LVEDVOLUME\n",
      "LVFAILURE->STROKEVOLUME\n",
      "HYPOVOLEMIA->LVEDVOLUME\n",
      "HYPOVOLEMIA->STROKEVOLUME\n",
      "INTUBATION-MINVOL\n",
      "INTUBATION->PRESS\n",
      "INTUBATION->SHUNT\n",
      "INTUBATION-VENTALV\n",
      "INTUBATION->VENTLUNG\n",
      "KINKEDTUBE->PRESS\n",
      "KINKEDTUBE->VENTLUNG\n",
      "MINVOLSET-VENTMACH\n",
      "PAP-PULMEMBOLUS\n",
      "VENTTUBE->PRESS\n",
      "VENTTUBE->VENTLUNG\n",
      "PULMEMBOLUS->SHUNT\n",
      "PVSAT->SAO2\n",
      "SHUNT->SAO2\n",
      "VENTMACH->VENTTUBE\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "m2 = Gobnilp()\n",
    "m2.learn('alarm_10000.dat',gurobi_output=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Without the independence constraint solving is a lot faster, even though the set of allowed BNs is greater without the constraint. This is basically because Gobnilp is optimised for the case where the only constraint is that the BN is acyclic. \n",
    "\n",
    "The number of \"Lazy constraints\" posted in the two runs is worth examining: without the constraint there are only 6 but with the independence constraint there are 1100. This is because Gobnilp is adding constraints ruling out BNs (strictly speaking ancestral subgraphs of BNs) which do not satisfy the independence constraint. This is a crude method of enforcing (conditional) independence constraints and this adds to the slowness of solving."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
